package com.sinog.core.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import com.sinog.core.utilbean.Constants;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc FastJson工具类
 * @author zy
 * @date 2019年6月20日 15点48分
 */
public final class JsonUtil {

    private static final SerializeConfig CONFIG;
    private static final String DATEFORMAT;

    static {
        DATEFORMAT = "yyyy-MM-dd HH:mm:ss";
        CONFIG = new SerializeConfig();
        // 自定义日期
        CONFIG.put(java.util.Date.class,new SimpleDateFormatSerializer(DATEFORMAT));
        CONFIG.put(java.sql.Date.class,new SimpleDateFormatSerializer(DATEFORMAT));
    }

    private static final SerializerFeature[] FEATURES = {
            // 输出空置字段
            SerializerFeature.WriteMapNullValue,
            // list字段如果为null，输出为[]，而不是null
            SerializerFeature.WriteNullListAsEmpty,
            // 数值字段如果为null，输出为0，而不是null
            SerializerFeature.WriteNullNumberAsZero,
            // Boolean字段如果为null，输出为false，而不是null
            SerializerFeature.WriteNullBooleanAsFalse,
            // 字符类型字段如果为null，输出为""，而不是null
            SerializerFeature.WriteNullStringAsEmpty};

    /**
     * json对象转字符串
     * @param object json对象
     * @return 字符串
     */
    public static String toText(Object object) {
        return JSON.toJSONString(object,CONFIG,FEATURES);
    }

    /**
     * json对象转字符串,定义返回的时间类型
     * @param object json对象
     * @param dateFormat 时间格式,如 yyyy-MM-dd
     * @return 字符串
     */
    public static String toTextSetDate(Object object,String dateFormat) {
        return JSON.toJSONStringWithDateFormat(object,dateFormat,FEATURES);
    }

    /**
     * json字符串转某对象
     * @param text json字符串
     * @param clazz clazz
     * @param <T> 范型
     * @return <T>
     */
    public static <T> T toBean(String text,Class<T> clazz) {
        return JSON.parseObject(text,clazz);
    }

    /**
     * json字符串转换为某对象List
     * @param text json字符串
     * @param clazz clazz
     * @param <T> 范型
     * @return <T>
     */
    public static <T> List<T> toList(String text,Class<T> clazz) {
        return JSON.parseArray(text,clazz);
    }

    /**
     * json字符串转化为map
     * @param s json字符串
     * @return Map<String,Object>
     */
    public static Map<String,Object> toMap(String s) {
        return JSON.parseObject(s);
    }

    /**
     * json字符串转换为某对象数组
     * @param text json字符串
     * @param clazz clazz
     * @param <T> 范型
     * @return <T>
     */
    public static <T> Object[] toArray(String text,Class<T> clazz) {
        return JSON.parseArray(text,clazz).toArray();
    }

    /**
     * json对象转字符串
     * @param total json对象
     * @param data json对象
     * @return String
     */
    public static String toText(Object total,Object data) {
        Map<String,Object> result = new HashMap<>(16);
        result.put("total",total);
        result.put("data",data);
        return JSON.toJSONString(result,CONFIG,FEATURES);
    }

    /**
     * json对象转字符串
     * @param data json对象
     * @return String
     */
    public static String toText1(Object data) {
        Map<String,Object> result = new HashMap<>(16);
        result.put("code",Constants.Number.NUM_ZERO);
        result.put("data",data);
        return JSON.toJSONString(result,CONFIG,FEATURES);
    }

    /**
     * json字符串转化为map,之后往map里面存放键值后再转换成json字符串
     * @param s json字符串
     * @param  params 动态数组，key,value,key,value...........
     * @return String 新增了一些数据的json字符串
     */
    public static String setObjectToJsonStr(String s,Object ... params) {
        Map<String,Object> map;
        if (s == null){
            map = new HashMap<>();
        } else {
            map = JSON.parseObject(s);
        }
        String key = "";
        Object value = null;
        for(int i = 1; i < params.length + 1; i++) {
            //参数
            if(0 != i % 2){
                key = (String)params[i-1];
            } else {
                //值
                value = params[i-1];
            }
            //轮训偶数次，代表一组新的key，value，则存储到map,重置key，value
            if(0 == i % 2){
                map.put(key,value);
            }
        }
        return toText(map);
    }

    /**
     * 从json字符串中根据key取value
     * @param jsonstr jsonstr
     * @param key key
     * @return String
     */
    public static String getValueFromJsonstrByKey(String jsonstr,String key){
        Map<String, Object> map = toMap(jsonstr);
        return (String) map.get(key);
    }

    /**
     * 判断json字符串中是否存在key对应的value
     * @param jsonstr jsonstr
     * @param key key
     * @return Boolean
     */
    public static Boolean getInfoFromJsonstrByKey(String jsonstr,String key){
        Map<String, Object> map = toMap(jsonstr);
        String s = map.get(key).toString();
        return !s.equals("[]") ;
    }
}